package org.chesmapper.view.gui.table; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.table.DefaultTableModel; import org.apache.commons.lang3.text.WordUtils; import org.chesmapper.map.dataInterface.CompoundProperty; import org.chesmapper.map.dataInterface.NumericProperty; import org.chesmapper.view.cluster.ClusterController; import org.chesmapper.view.cluster.Clustering; import org.chesmapper.view.cluster.Compound; import org.chesmapper.view.gui.ViewControler; import org.mg.javalib.gui.ClickMouseOverTable; public abstract class CCDataTable extends DataTable { protected int nonPropColumns; protected ClickMouseOverTable table; protected int sortColumn = 1; public static void show(ViewControler viewControler, ClusterController clusterControler, Clustering clustering, boolean cluster) { List<CompoundProperty> props = clustering.selectPropertiesAndFeaturesWithDialog("Select features to show in " + (cluster ? "cluster" : "compound") + " table.", viewControler.getHighlightedProperty(), false, !cluster, !cluster, !cluster); if (props != null) { if (cluster) new ClusterTable(viewControler, clusterControler, clustering, props); else new CompoundTable(viewControler, clusterControler, clustering, props); } } public CCDataTable(ViewControler viewControler, ClusterController clusterControler, Clustering clustering, List<CompoundProperty> props) { super(viewControler, clusterControler, clustering, props); } public abstract String getExtraColumn(); public abstract boolean addAdditionalProperties(); protected void updateFeatureSelection() { if (selfUpdate) return; selfUpdate = true; if (viewControler.getHighlightedProperty() != null) { CompoundProperty prop = viewControler.getHighlightedProperty(); int idx = props.indexOf(prop); if (idx != -1) sortColumn = idx + nonPropColumns; } List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>(); sortKeys.add(new RowSorter.SortKey(sortColumn, SortOrder.ASCENDING)); sorter.setSortKeys(sortKeys); selfUpdate = false; } @Override protected DefaultTableModel createTableModel() { DefaultTableModel model = new DefaultTableModel() { @Override public Class<?> getColumnClass(int columnIndex) { if (columnIndex == 0) return Integer.class; if (columnIndex == 1) return Compound.class; if (columnIndex >= nonPropColumns && props.get(columnIndex - nonPropColumns) instanceof NumericProperty) return Double.class; return String.class; } @Override public boolean isCellEditable(int row, int column) { return false; } }; model.addColumn(""); model.addColumn(WordUtils.capitalize(getItemName())); model.addColumn(getExtraColumn()); nonPropColumns = model.getColumnCount(); for (CompoundProperty p : props) model.addColumn(p); return model; } protected void updateTableFromSelection(boolean active, int... selected) { if (selfUpdate) return; selfUpdate = true; if (active) table.getClickSelectionModel().clearSelection(); else table.getSelectionModel().clearSelection(); if (selected.length > 1 || (selected.length == 1 && selected[0] != -1)) { int idx = -1; for (int i : selected) { idx = sorter.convertRowIndexToView(i); if (active) table.getClickSelectionModel().setSelected(idx, false); else table.getSelectionModel().addSelectionInterval(idx, idx); } table.scrollRectToVisible(new Rectangle(table.getCellRect(idx, 0, true))); } selfUpdate = false; } }